import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体和样式
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体为黑体
plt.rcParams['axes.unicode_minus'] = False     # 解决负号显示问题

class FinancialAnalyzer:
    def __init__(self):
        # 资产负债表数据
        self.balance_sheet = {
            '流动资产': 9129136682.85,
            '非流动资产': 3854759326.22,
            '流动负债': 5896406708.37,
            '非流动负债': 2537885428.18,
            '所有者权益': 4549603872.52
        }
        
        # 利润表数据
        self.income_statement = {
            '2023前三季度': {
                '营业收入': 2481486615.43,
                '营业成本': 1961121829.41,
                '净利润': 194059234.58,
                '销售费用': 107410761.56,
                '管理费用': 104838664.05,
                '研发费用': 82456106.06,
                '财务费用': 166946956.29
            },
            '2022前三季度': {
                '营业收入': 3056281518.35,
                '营业成本': 2441743044.46,
                '净利润': 318641647.42,
                '销售费用': 123406339.98,
                '管理费用': 116170389.09,
                '研发费用': 98671441.58,
                '财务费用': 152358978.70
            }
        }
        
        # 现金流量表数据
        self.cash_flow = {
            '2023前三季度': {
                '经营活动现金流量': 28361017.51,
                '投资活动现金流量': 81158307.97,
                '筹资活动现金流量': -305169977.59
            },
            '2022前三季度': {
                '经营活动现金流量': 11879110.24,
                '投资活动现金流量': 41033280.78,
                '筹资活动现金流量': -117727898.93
            }
        }

    def format_to_yi(self, value):
        """将数值转换为亿元"""
        return round(value / 100000000, 2)

    def plot_balance_sheet_structure(self):
        """绘制资产负债结构分析图"""
        plt.figure(figsize=(15, 7))
        colors = ['#4682B4', '#76B7B2', '#E15759', '#FF9DA7', '#59A14F']
        
        # 资产结构饼图
        plt.subplot(121)
        assets = [self.balance_sheet['流动资产'], self.balance_sheet['非流动资产']]
        labels = ['流动资产', '非流动资产']
        patches, texts, autotexts = plt.pie(assets, labels=labels, autopct='%1.1f%%', 
                                          colors=colors[:2], startangle=90)
        # 设置字体大小
        plt.setp(autotexts, size=9, weight="bold")
        plt.setp(texts, size=10)
        plt.title('资产结构分析', pad=20, size=12)
        
        # 负债和所有者权益结构饼图
        plt.subplot(122)
        liab_equity = [self.balance_sheet['流动负债'], 
                      self.balance_sheet['非流动负债'],
                      self.balance_sheet['所有者权益']]
        labels = ['流动负债', '非流动负债', '所有者权益']
        patches, texts, autotexts = plt.pie(liab_equity, labels=labels, autopct='%1.1f%%', 
                                          colors=colors[2:], startangle=90)
        # 设置字体大小
        plt.setp(autotexts, size=9, weight="bold")
        plt.setp(texts, size=10)
        plt.title('负债与所有者权益结构', pad=20, size=12)
        
        plt.suptitle('资产负债结构分析', fontsize=14, y=1.02)
        plt.tight_layout()
        plt.savefig('资产负债结构分析.png', bbox_inches='tight', dpi=300)
        plt.close()

    def plot_income_analysis(self):
        """绘制收入和利润分析图"""
        plt.figure(figsize=(12, 6))
        
        # 数据准备
        periods = list(self.income_statement.keys())
        revenue = [self.format_to_yi(self.income_statement[p]['营业收入']) for p in periods]
        profit = [self.format_to_yi(self.income_statement[p]['净利润']) for p in periods]
        
        x = np.arange(len(periods))
        width = 0.35
        
        # 绘制柱状图
        plt.bar(x - width/2, revenue, width, label='营业收入', color='#4682B4')
        plt.bar(x + width/2, profit, width, label='净利润', color='#59A14F')
        
        # 添加数据标签
        for i, v in enumerate(revenue):
            plt.text(i - width/2, v, f'{v}亿', ha='center', va='bottom', fontsize=10)
        for i, v in enumerate(profit):
            plt.text(i + width/2, v, f'{v}亿', ha='center', va='bottom', fontsize=10)
        
        plt.title('收入利润分析', fontsize=12, pad=20)
        plt.xlabel('期间', fontsize=10)
        plt.ylabel('金额（亿元）', fontsize=10)
        plt.xticks(x, periods, fontsize=10)
        plt.legend(fontsize=10)
        plt.grid(True, linestyle='--', alpha=0.7)
        
        plt.tight_layout()
        plt.savefig('收入利润分析.png', dpi=300, bbox_inches='tight')
        plt.close()

    def plot_expense_structure(self):
        """绘制费用结构分析图"""
        plt.figure(figsize=(10, 6))
        
        # 准备2023年费用数据
        expenses = {
            '销售费用': self.income_statement['2023前三季度']['销售费用'],
            '管理费用': self.income_statement['2023前三季度']['管理费用'],
            '研发费用': self.income_statement['2023前三季度']['研发费用'],
            '财务费用': self.income_statement['2023前三季度']['财务费用']
        }
        
        # 转换为亿元
        expenses_yi = {k: self.format_to_yi(v) for k, v in expenses.items()}
        colors = ['#4682B4', '#59A14F', '#E15759', '#76B7B2']
        
        patches, texts, autotexts = plt.pie(expenses_yi.values(), 
                                          labels=expenses_yi.keys(), 
                                          autopct='%1.1f%%',
                                          colors=colors,
                                          startangle=90)
        
        # 设置字体大小
        plt.setp(autotexts, size=9, weight="bold")
        plt.setp(texts, size=10)
        
        plt.title('2023年前三季度费用结构', fontsize=12, pad=20)
        plt.axis('equal')  # 确保饼图是圆的
        
        plt.tight_layout()
        plt.savefig('费用结构分析.png', dpi=300, bbox_inches='tight')
        plt.close()

    def plot_cash_flow_analysis(self):
        """绘制现金流量分析图"""
        plt.figure(figsize=(12, 6))
        
        # 数据准备
        cash_flows = ['经营活动现金流量', '投资活动现金流量', '筹资活动现金流量']
        periods = list(self.cash_flow.keys())
        
        x = np.arange(len(cash_flows))
        width = 0.35
        
        # 转换为亿元
        cash_flow_2023 = [self.format_to_yi(self.cash_flow['2023前三季度'][cf]) for cf in cash_flows]
        cash_flow_2022 = [self.format_to_yi(self.cash_flow['2022前三季度'][cf]) for cf in cash_flows]
        
        # 绘制柱状图
        plt.bar(x - width/2, cash_flow_2023, width, label='2023前三季度', color='#4682B4')
        plt.bar(x + width/2, cash_flow_2022, width, label='2022前三季度', color='#59A14F')
        
        # 添加数据标签
        for i, v in enumerate(cash_flow_2023):
            plt.text(i - width/2, v, f'{v}亿', ha='center', 
                    va='bottom' if v > 0 else 'top', fontsize=10)
        for i, v in enumerate(cash_flow_2022):
            plt.text(i + width/2, v, f'{v}亿', ha='center', 
                    va='bottom' if v > 0 else 'top', fontsize=10)
        
        plt.title('现金流量分析', fontsize=12, pad=20)
        plt.xlabel('现金流量类型', fontsize=10)
        plt.ylabel('金额（亿元）', fontsize=10)
        plt.xticks(x, cash_flows, fontsize=10)
        plt.legend(fontsize=10)
        plt.grid(True, linestyle='--', alpha=0.7)
        
        plt.tight_layout()
        plt.savefig('现金流量分析.png', dpi=300, bbox_inches='tight')
        plt.close()

    def generate_analysis_report(self):
        """生成财务分析报告"""
        report = f"""
财务分析报告

1. 资产负债情况：
   - 总资产：{self.format_to_yi(sum(self.balance_sheet.values()))}亿元
   - 资产负债率：{round((self.balance_sheet['流动负债'] + self.balance_sheet['非流动负债']) / sum(self.balance_sheet.values()) * 100, 2)}%
   - 流动资产占比：{round(self.balance_sheet['流动资产'] / (self.balance_sheet['流动资产'] + self.balance_sheet['非流动资产']) * 100, 2)}%

2. 经营情况分析：
   - 2023前三季度营业收入：{self.format_to_yi(self.income_statement['2023前三季度']['营业收入'])}亿元
   - 营业收入同比变动：{round((self.income_statement['2023前三季度']['营业收入'] - self.income_statement['2022前三季度']['营业收入']) / self.income_statement['2022前三季度']['营业收入'] * 100, 2)}%
   - 净利润：{self.format_to_yi(self.income_statement['2023前三季度']['净利润'])}亿元
   - 净利润同比变动：{round((self.income_statement['2023前三季度']['净利润'] - self.income_statement['2022前三季度']['净利润']) / self.income_statement['2022前三季度']['净利润'] * 100, 2)}%

3. 现金流量分析：
   经营活动现金流量：
   - 2023前三季度：{self.format_to_yi(self.cash_flow['2023前三季度']['经营活动现金流量'])}亿元
   - 2022前三季度：{self.format_to_yi(self.cash_flow['2022前三季度']['经营活动现金流量'])}亿元
   - 同比变动：{round((self.cash_flow['2023前三季度']['经营活动现金流量'] - self.cash_flow['2022前三季度']['经营活动现金流量']) / abs(self.cash_flow['2022前三季度']['经营活动现金流量']) * 100, 2)}%

4. 主要结论：
   - 公司资产结构稳健，流动资产占比较高
   - 收入和利润同比有所下降，需关注经营压力
   - 经营性现金流有所改善，但筹资活动现金流为负
   - 费用结构中财务费用占比较高，需控制融资成本
        """
        
        with open('财务分析报告.txt', 'w', encoding='utf-8') as f:
            f.write(report)

def main():
    # 创建分析器实例
    analyzer = FinancialAnalyzer()
    
    # 生成所有分析图表
    analyzer.plot_balance_sheet_structure()
    analyzer.plot_income_analysis()
    analyzer.plot_expense_structure()
    analyzer.plot_cash_flow_analysis()
    
    # 生成分析报告
    analyzer.generate_analysis_report()
    
    print("财务分析完成！已生成以下文件：")
    print("1. 资产负债结构分析.png - 资产负债结构分析图")
    print("2. 收入利润分析.png - 收入和利润分析图")
    print("3. 费用结构分析.png - 费用结构分析图")
    print("4. 现金流量分析.png - 现金流量分析图")
    print("5. 财务分析报告.txt - 详细分析报告")

if __name__ == "__main__":
    main()